package cn.doyens.reggie.controller;

import cn.doyens.reggie.common.R;
import cn.doyens.reggie.entity.Employee;
import cn.doyens.reggie.service.EmployeeService;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import io.swagger.annotations.*;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.DigestUtils;

import org.springframework.web.bind.annotation.*;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import java.time.LocalDateTime;

@Slf4j
@RestController
@RequestMapping("/employee")
@Api(tags = "用户")
public class EmployeeController {

    @Autowired
    private EmployeeService employeeService;

    /**
     *   登陆逻辑：
     *      1.获取用户输入的密码 并将其进行MD5加密
     *      2. 然后调用employeeService中的login方法 查询指定用户名查询employee表   查询获得emp对象实例
     *      3.  判断查询到的emp对象是否为空  如果为空则 返回结果 提示登录失败
     *      4.  取出emp对象中的密码值与 MD5加密后用户提交的密码 进行比较  当密码不相等时 提示登陆失败
     *      5.  取出emp对象中的status字段时 判断当前员工是否处于正常工作状态 如果值不等于1 则提示员工无法登陆 请联系管理员
     *      6.   将员工的id存入到session域中保存
     *      7. 通过return 返回 R对象 携带 登陆成功信息
     *
     * @param employee
     * @param request
     * @return
     */
    @ApiOperation("登录接口")
    @RequestMapping("/login")
    public R<Employee> login(@RequestBody Employee employee, HttpServletRequest request){
        //1.获取用户输入的密码 并将其进行MD5加密
        String password = employee.getPassword();
        //将明文密码 通过分解工具类 进行MD5加密
         password = DigestUtils.md5DigestAsHex(password.getBytes());
       // 2. 然后调用employeeService中的login方法 查询指定用户名查询employee表   查询获得emp对象实例
        QueryWrapper<Employee> queryWrapper= new QueryWrapper<>();
        queryWrapper.eq("username",employee.getUsername());
        Employee emp = this.employeeService.getOne(queryWrapper);


        //3.  判断查询到的emp对象是否为空  如果为空则 返回结果 提示登录失败
        if(emp==null){
            return R.error("登陆失败");
        }
        //4.  取出emp对象中的密码值与 MD5加密后用户提交的密码 进行比较  当密码不相等时 提示登陆失败
        if(!password.equals(emp.getPassword())){
            return R.error("登陆失败");
        }
        //5.  取出emp对象中的status字段时 判断当前员工是否处于正常工作状态 如果值不等于1 则提示员工无法登陆 请联系管理员
        if(emp.getStatus()==0){
            return R.error("员工无法登陆 请联系管理员");
        }
        //6.   将员工的id存入到session域中保存
        HttpSession session = request.getSession();
        session.setAttribute("employee",emp.getId());

        // 7. 通过return 返回 R对象 携带 登陆成功信息
        return R.success(emp);
    }


    @RequestMapping(value = "/logout" )
    public R<String> logout(HttpServletRequest request){
        //移除session域中的 键为employee的键值对
        request.getSession().removeAttribute("employee");

        return  R.success("登出成功");
    }


    /**
     * 添加员工操作
     *    添加操作时 使用Post方式提交  @PostMappring
     *    查询操作时 使用get方式请求   @GetMapping
     *    删除操作时 使用delete方式请求  @DeleteMapping
     *    修改操作时 使用put方式请求   @Putmapping
     */
    @ApiOperation("添加员工")
    @PostMapping

    public R<String> save(@RequestBody Employee employee){
        //1.生成默认的加密 密码  默认初始密码为123456
        String password = DigestUtils.md5DigestAsHex("123456".getBytes());
        //3.为employee 补齐默认字段
        employee.setPassword(password);
        //4.通过employeeservice调用save方法 保存员工信息
        //当用户名重名时 会报错 提示指定条目已经存在
        this.employeeService.save(employee);
        return R.success("添加成功");
    }


    /**
     *  定义分页查询功能方法
     * @param page
     * @param pageSize
     * @param name
     * @return
     */
    @ApiOperation("分页搜索")
    @GetMapping("/page")

    @ApiImplicitParams({
             @ApiImplicitParam(name = "page",value = "页码",required = true),
             @ApiImplicitParam(name = "pageSize",value = "每页记录数",required = true),
             @ApiImplicitParam(name = "name",value = "用户名称",required = false)
    })
    public R<Page> getPageInfo( Long page,Long pageSize,String name){
        //1.创建Page对象 将page 及pageSize
        Page<Employee> pageInfo = new Page<>(page,pageSize);

        long threadId = Thread.currentThread().getId();
        log.info("getPageInfo---当前操作的线程id为："+threadId);
        //2.创建条件对象
       /* QueryWrapper<Employee> queryWrapper = new QueryWrapper<>();
        if(StringUtils.isNotBlank(name)){// isNotEmpty  "  "
            queryWrapper.like("name",name);
            queryWrapper.orderByDesc("updateTime");
        }*/
        //3.通过employeeService调用 page方法进行分页查询
         //this.employeeService.page(pageInfo,queryWrapper);

        //  java jdk1.8后 提供的:: 表示 method refresh 方法引用 （）
        LambdaQueryWrapper<Employee> queryWrapper = new LambdaQueryWrapper<>();
        //通过lambda条件查询对象 进行模糊条件查询 首先判断name字段是否为空 不为空时在进行 查询字段的拼接
        queryWrapper.like(StringUtils.isNotBlank(name),Employee::getName,name);
        //按照修改时间进行 排序
        queryWrapper.orderByDesc(Employee::getUpdateTime);

        // 3.通过employeeService调用 page方法进行分页查询
        this.employeeService.page(pageInfo,queryWrapper);

        //4.将查询的Page对象 赋值给R中的data字段 协带返回
        return R.success(pageInfo);
    }

    /**
     * 修改员工状态字段方法
     * @param employee
     * @return
     */
    @PutMapping
    @ApiOperation("修改用户")
    public R<String> editStatus(@RequestBody Employee employee){
        long threadId = Thread.currentThread().getId();
        log.info("editStatus---当前操作的线程id为："+threadId);
         //3.通过employeeService调用 updateById方法
        this.employeeService.updateById(employee);
        return R.success("修改成功");
    }


    //http://localhost:8080/employee?id=15622
    //http://localhost:8080/employee/15622
    @GetMapping("{id}")
    @ApiOperation("根据id查看用户")
    public R<Employee> queryEmployeeById(@PathVariable Long id){
        log.info("获取前端页面提交过来的id："+id);
        Employee emp = this.employeeService.getById(id);
        return R.success(emp);
    }
}
